package com.example.testgenerate.generate;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.FileType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


//根据表名自动生成java文件
public class Generator {
	/** 项目配置  **/
	private static final String projectPath = System.getProperty("user.dir");
	private static final String javaDir = "/src/main/java/";
	private static final String resourceDir = "/src/main/resources/";

	/** 数据源配置 **/         //58.1.3.12:8066 数据库版本不支持
	private static final String url = "jdbc:mysql://4437.154507.6340.143430:3306/bishe?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false";
	private static final String driverName = "com.mysql.cj.jdbc.Driver";
	private static final String userName = "bererot3434";
	private static final String secret = "@3r33r3r4r4";


	/** 包配置 **/
	private static final String parent="com.bjq"; //父包名
	private static final String moduleName = ""; //模块名
	private static final String tablePrefix="att_t"; //需要过滤的表前缀

	/** 全局配置 **/
	private static final String author = "bjq";


	public static void main(String[] args) {
		String [] tables = {"user"};
		generateByTables(tables);//li作者。test数据库名。user表名。
		System.out.println("completed...");
	}

    /**
     * @param tableNames 表名
     */
    private static void generateByTables( String... tableNames) {
        //数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL)
                .setUrl(url)
                .setUsername(userName)
                .setPassword(secret)
                .setDriverName(driverName);
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig
		        //数据库表映射到实体的命名策略（下划线转驼峰）
		        .setNaming(NamingStrategy.underline_to_camel)
		        //数据库表字段映射到实体的命名策略, 未指定按照 naming 执行（下划线转驼峰）
//                .setColumnNaming(NamingStrategy.underline_to_camel)
//                //全局大写命名
//                .setCapitalMode(true)
                //表前缀(如果要生成的表不是此前缀，则不会去掉前缀)
                .setTablePrefix(tablePrefix)
                //【实体】是否为lombok模型（默认 false）
                .setEntityLombokModel(false)
                // 指定表名和字段名是否使用了下划线
//                .setDbColumnUnderline(true)
                //驼峰转连字符
                .setControllerMappingHyphenStyle(true)
                //修改替换成你需要的表名，多个表名传数组
                .setInclude(tableNames);
        
        //全局配置
        GlobalConfig config = new GlobalConfig(); 
        config.setActiveRecord(false) // 是否开启AR模式
                .setAuthor(author) //作者
                .setOutputDir(projectPath + javaDir)//生成的java到文件夹下
                .setFileOverride(true)// 指定文件覆盖
                .setEnableCache(false)//是否在xml中添加二级缓存配置
                .setIdType(IdType.AUTO) // 设置主键自增策略
				.setBaseResultMap(true) //生成基础BaseResultMap
				.setBaseColumnList(true) //生成基础BaseColumnList
				.setOpen(false)
				.setDateType(DateType.ONLY_DATE) //设置时间类型只为DATE
				.setSwagger2(true) //添加swagger注解
            	.setServiceName("%sService"); // 设置生成的services接口的名字的首字母是否为I

      
        
        PackageConfig pc = new PackageConfig()
        .setParent(parent)
        .setModuleName(moduleName)
        .setController("controller")//生成的代码到文件夹下cn.demo.web
        .setEntity("po")
        .setMapper("mapper")
        .setService("service")
        .setServiceImpl("service.impl")
        .setXml("");
        //模板配置
  	  TemplateConfig tc = new TemplateConfig()
  			  .setController("")
			  .setXml(""); //不要生成controller
//	  //自定义配置
	  InjectionConfig cfg = getMapperInjectionConfig();
	
  	
  	  new AutoGenerator().setGlobalConfig(config) //全局配置
            .setDataSource(dataSourceConfig)
            .setPackageInfo(pc)
            .setTemplate(tc)
            .setTemplateEngine(new FreemarkerTemplateEngine())
            .setCfg(cfg)
            .setStrategy(strategyConfig)
            .execute();
    }
    

    public static InjectionConfig getMapperInjectionConfig() {
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };
        
        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";
        
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
        	@Override
          public String outputFile(TableInfo tableInfo) {
       		return projectPath + resourceDir + "/" + tableInfo.getEntityName() + "/Mapper" + StringPool.DOT_XML;
        	}
       });
		cfg.setFileOutConfigList(focList);
//        判断是否创建文件
        cfg.setFileCreate(new IFileCreate() {
        	   @Override
        	   public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
        	    boolean fileExists  = new File(filePath).exists();
        	    switch (fileType) {
	        	     case ENTITY:
						 return true; //实体类直接覆盖
					case OTHER:
						return true;  //xml覆盖
					default:
						 break;
        	    }
        	    this.checkDir(filePath);
        	    return !fileExists; //其它文件存在则不创建
        	   }
        	  });
        return cfg;
    }

}
